package com.hsoft.zhxy.common.config;

import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * Swagger文档配置类
 */
@Configuration
@EnableSwagger2
@Log4j2
public class SwaggerConfig {
    
    // 访问方式
    // http://127.0.0.1:8080/swagger-ui.html

    // 是否启用在线API文档
    @Value("${swagger.enable}")
    private Boolean enable;

    // API文档名
    @Value("${spring.application.name}")
    private String apiName;

    // 警告信息
    private static int warnInfo = 0;



    /**
     * 自定义API分组
     * @return
     */
    @Bean
    public Docket demo_03_01() {
        String antPattern       = "/demo_03_01/**";     // 路径
        String groupName        = "demo_03_01";         // API组名
        return this.createDocket(antPattern, groupName);
    }

    /**
     * 自定义API分组
     * @return
     */
    @Bean
    public Docket layout_03_01() {
        String antPattern       = "/layout_03_01/**";   // 路径
        String groupName        = "layout_03_01";       // API组名
        return this.createDocket(antPattern, groupName);
    }

    /**
     * 自定义API分组
     * @return
     */
    @Bean
    public Docket xtgl_02_01() {
        String antPattern       = "/xtgl_02_01/**"; // 路径
        String groupName        = "xtgl_02_01";     // API组名
        return this.createDocket(antPattern, groupName);
    }

    // 其他自定义API分组，顺序向下增加即可!
    // ...
    // ...
    // ...










    // Swagger ApiInfo构造
    private ApiInfo apiInfo(String name, String description, String version) {
        return new ApiInfoBuilder().title(name).description(description).version(version).build();
    }

    // Swagger Docket构造
    private Docket createDocket(String antPattern, String groupName){

        // swagger启用时的信息提示
        if(enable && warnInfo==0){
            System.out.println("");
            System.out.println("#########################################swagger安全警告#########################################");
            System.out.println("##安全警告                                                                                     ##");
            System.out.println("##Swagger在线文档已启动.                                                                        ##");
            System.out.println("##正式上线后必须关闭swagger文档。 (将config.properties文件中的swagger.enable设置为false)             ##");
            System.out.println("##如果缺少小应用的API文档，请查看com.hsoft.zhxy.common.config.SwaggerConfig中是否添加了对应的分组代码。 ##");
            System.out.println("#########################################swagger安全警告#########################################");
            System.out.println("");
            warnInfo=1;
        }
        // swagger未启用时的信息提示
        if(!enable && warnInfo==0){
            System.out.println("");
            System.out.println("#########################################swagger业务提示#########################################");
            System.out.println("##业务提示                                                                                     ##");
            System.out.println("##Swagger在线文档已关闭.                                                                        ##");
            System.out.println("##启动方法:将config.properties文件中的swagger.enable设置为true.                                   ##");
            System.out.println("#########################################swagger业务提示#########################################");
            System.out.println("");
            warnInfo=1;
        }

        return new Docket(DocumentationType.SWAGGER_2)
                .enable(enable)
                .apiInfo(apiInfo(this.apiName, "", ""))
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.ant(antPattern))
                .build()
                .groupName(groupName)
                .pathMapping("/");
    }

}